package org.secKill.service;

import java.util.List;

import org.secKill.dto.Exposer;
import org.secKill.dto.SeckillExecution;
import org.secKill.entity.Seckill;
import org.secKill.enums.DataSourceType;
import org.secKill.exception.RepeatKillException;
import org.secKill.exception.SeckillCloseException;
import org.secKill.exception.SeckillException;
import org.secKill.util.DataSource;

public interface SeckillService {

	/**
	 * 查询全部的秒杀记录库存，可以设置成分页查询形式。每页4条数据
	 * 
	 * @return
	 */
	@DataSource(DataSourceType.Slave)
	List<Seckill> getSeckillList();

	/**
	 * 查询单个秒杀记录
	 * 
	 * @param seckillId
	 * @return
	 */
	@DataSource(DataSourceType.Slave)
	Seckill getById(long seckillId);

	// 再往下，是我们最重要的行为的一些接口

	/**
	 * 在秒杀开启时输出秒杀接口的地址，否则输出系统时间和秒杀时间
	 * 
	 * @param seckillId
	 */
	@DataSource
	Exposer exportSeckillUrl(long seckillId);

	/**
	 * 执行秒杀操作，有可能失败，有可能成功，所以要抛出我们允许的异常
	 * 
	 * @param seckillId
	 * @param userPhone
	 * @param md5
	 * @return
	 */
	@DataSource
	SeckillExecution executeSeckill(long seckillId, long userPhone, String md5)
			throws SeckillException, RepeatKillException, SeckillCloseException;
	@DataSource
	SeckillExecution executeSeckillProcedure(long seckillId, long userPhone, String md5);

}
